perm filename PASTE.SAI[PUB,SYS]2 blob sn#645426 filedate 1982-03-09 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00015 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002	BEGOF("PASTE")
C00004 00003	PUBLIC SIMPLE PROCEDURE PASTE! $"#
C00005 00004	PUBLIC RECURSIVE PROCEDURE DBREAK $"#
C00007 00005	PUBLIC SIMPLE STRING PROCEDURE ENOUGH(STRING STR  INTEGER WID, F) $"#
C00008 00006	PUBLIC INTEGER SIMPLE PROCEDURE LINESLEFT $"#
C00009 00007	PUBLIC SIMPLE PROCEDURE SAVEXGEN
C00010 00008	PUBLIC RECURSIVE INTEGER PROCEDURE XGENKLUDGE(INTEGER LL REFERENCE INTEGER NEWOVEREST)
C00012 00009	PUBLIC RECURSIVE INTEGER PROCEDURE FIND!ROOM(INTEGER SOURCE,
C00017 00010	PUBLIC INTEGER SIMPLE PROCEDURE NEWBLANK(INTEGER MOLE) $"#
C00018 00011	PRIVATE SIMPLE INTEGER PROCEDURE OWLOUT(STRING C1,C2,C3) $"#
C00020 00012	PUBLIC RECURSIVE PROCEDURE PLACELINE(INTEGER CHARS,POSN,XPOSN,FAKE,
C00030 00013	PUBLIC SIMPLE PROCEDURE SNEAKLINE(STRING S) $"#
C00031 00014	PRIVATE SIMPLE INTEGER PROCEDURE TOPMOST(INTEGER COLNO, LINO) $"#
C00032 00015	FINISHED
C00033 ENDMK
C⊗;
BEGOF("PASTE")

COMMENT

                *** Variations at Different Sites ***

In PLACELINE, some sites don't need to allocate extra text lines for
superscripts and subscripts in XCRIBL mode.

                                 ***


Paste a line, with its leading and somescripts and footnotes,
into a column obeying GROUP constraints.

;

PROCEDURES
PUBLIC SIMPLE PROCEDURE PASTE! ;$"#
BEGIN "PASTE!"
FTGP ← 0 ;
FTGP2 ← 0 ; TES 11/2/74 ;
MILLVERTI ← -MILLVERTIDEFAULT ; TES 11/2/74 SET TO MSPREADM AT 1ST TEXT LINE ;
NEEDMILLVERTI ← FALSE ; TES 11/2/74 ;
BIND(DECLARE(SYMNUM("FOOT"), PORTYPE), IXFOOT ← PUTI(4, -1)) ;
MESGS ← 0 ;
NOPGPH ← TRUE ;
TELLXGEN ← 0; ME 3/7/82 Assume user doesn't want to know about OVEREST;
END "PASTE!" ;
PUBLIC RECURSIVE PROCEDURE DBREAK ;$"#
IF ON THEN	IF NOPGPH THEN NOPGPH ← -1 ELSE
BEGIN INTEGER STTS ;
NOPGPH ← -1 ;
BOUND(3) ;
IF POSN > INDENT OR VERBATIM OR SNUCK THEN  TES 11/17/74 SNUCK;
	BEGIN "A PGPH"
	SNUCK ← FALSE ; TES 11/17/74 ;
	PLACELINE(IF LASTWDBRK=OAKS THEN OAKS-1 ELSE OAKS, POSN MIN MAXIM, XMAXIM-FSHORT,
		FAKE, ABOVEX MAX BRKABX,
		-(BELOWX MIN BRKBLX),
		IF NOFILL THEN LEADNM ELSE IF FIRST THEN LEADFM ELSE SPREADM-1,
		IF NOFILL THEN MLEADNM ELSE IF FIRST THEN MLEADFM ELSE MSPREADM,
		PLBL, JUSTJUST, 0) ;
	FSHORT ← SINCELFM ← 0 ;
	IF ENDCASE=2 THEN BEGIN STTS←STARTS; IF ENDBLOCK THEN WARN("=","Missed END in Response|Footnote");
	STARTS ← STARTS + STTS ; END ;
	END "A PGPH"
ELSE SNUCK ← FALSE  ;  TES 11/17/74 ;
END "DBREAK" ;
PUBLIC SIMPLE STRING PROCEDURE ENOUGH(STRING STR ; INTEGER WID, F) ;$"#
	BEGIN TES 11/29/73 enough of STR to extend WID charws in font F ;
	INTEGER WASF, N, X ; STRING S2 ;
	WASF ← THISFONT ; S2 ← STR ;
	IDASSIGN(FNTFIL[F], CW) ; X ← WID * CHARW ; N ← 0 ;
	WHILE FULSTR(S2) AND X GEQ 0 DO
		BEGIN N←N+1 ; X ← X-CW[LOP(S2)] END ;
	IF X<0 THEN N ← N-1 ;
	IDASSIGN(FNTFIL[WASF], CW) ;
	RETURN(STR[1 TO N]) ;
	END ;
PUBLIC INTEGER SIMPLE PROCEDURE LINESLEFT ;$"#
BEGIN
INTEGER TOT, LEFT ;
TOT ← LEFT ← IF AREAIXM AND 0 LEQ STATUS LEQ 2 THEN LINES ELSE LINECT(IXTEXT) ;
LEFT ← LEFT + XGENLINES; RKJ;
IF STATUS=1 THEN LEFT ← LEFT - (LINE + COVERED + PINE) ;
IF NOT NOPGPH THEN LEFT ← LEFT - ( 1+(ABOVEX MAX BRKABX)-(BELOWX MIN BRKBLX)+
	(IF NOFILL THEN LEADNM ELSE IF FIRST THEN LEADFM ELSE SPREADM-1) ) ;
RETURN(IF LEFT<0 THEN -(LEFT+TOT) ELSE LEFT) ;
END "LINESLEFT" ;
PUBLIC SIMPLE PROCEDURE SAVEXGEN;
ME 3/7/82 Remember how much extra space we make in a group that gets move
onto a later page.  MoveGroup sets XGENLINES and OVEREST to the amounts
by which they have increased since they were saved;
IF NOT GROUPM THEN
	BEGIN
	OVERGBEG←OVEREST;
	XGENGBEG←XGENLINES;
	END;
PUBLIC RECURSIVE INTEGER PROCEDURE XGENKLUDGE(INTEGER LL; REFERENCE INTEGER NEWOVEREST);
ME subroutinized 3/3/82, returns adjustment to XGENLINES, sets NEWOVEREST;
IF XCRIBL AND (COL = 1 OR COL = COLS+1) THEN TES 11/19/73 COL 1 ONLY! ;
  BEGIN "KLUDGE"
	OWN INTEGER STD,XADJ;
		    ME: 3/1/82 fixed below for skiplines, etc;
	NEWOVEREST←OVEREST+LL*((STD←STDCHARH)-CHARH);
		    RKJ: 6-Feb-75 made code below more nearly correct ;
	IF NEWOVEREST NEQ 0 THEN
		BEGIN "MUST FIXUP"
		XADJ←0;
		STD←STD + (MILLVERTI*VBPI+500) DIV 1000;
		IF NEWOVEREST>0 THEN
			BEGIN 
			XADJ←NEWOVEREST DIV STD; 
			NEWOVEREST←NEWOVEREST MOD STD;
			END
		ELSE WHILE NEWOVEREST<0 DO 
			BEGIN
			XADJ←XADJ-1;
			NEWOVEREST←NEWOVEREST+STD;
			END;
		RETURN(XADJ);
		END "MUST FIXUP"
	ELSE RETURN(0);
  END "KLUDGE"
ELSE RETURN(0);
PUBLIC RECURSIVE INTEGER PROCEDURE FIND!ROOM(INTEGER SOURCE,
	EXTRA, FROMCOL, FROMLINE, MORECOMING) ;$"#
BEGIN "FIND!ROOM"
INTEGER WANT, LEAD, I, C, L, SAVEAREA, KOLS, DUM ;  LABEL FOUND, TRYHERE ;
STRING FTSTR ; TES 9/12/74 ;
ASSUREAREA ;
IF SOURCE LEQ 0 THEN BEGIN WANT←EXTRA ; LEAD←-SOURCE END ELSE BEGIN WANT←1; LEAD←0 END;
IF WANT > LINES THEN TES 12/6/73 LENGTHENED MESSAGE ;
	BEGIN WARN("Can't fit here",
	<"This line (with its PREFACE,SPREAD,SOMESCRIPTS) needs " &
	CVS(WANT) & " lines of paper,
	but AREA " & SYM[LDB(BIXNUM(AREAIXM))] &
	" is declared only " & CVS(LINES) & " lines HIGH">);
	RETURN(FALSE) ;
	END;
KOLS ← IF FROMCOL > COLS THEN 2*COLS ELSE COLS ;
TRYHERE:
FOR C ← FROMCOL THRU KOLS DO
	IF (LINES-MORECOMING) - (L← IF C=FROMCOL THEN FROMLINE ELSE 0) + XGENLINES +
		XGENKLUDGE(IF L THEN WANT+LEAD ELSE WANT,DUM)  ME 3/3/82 look ahead to gained/lost space;
		- PINE  GEQ
		(IF L THEN WANT+LEAD ELSE WANT) THEN GO TO FOUND ;
IF TELLXGEN THEN outstr("Page "&pageval&", RXgenlines = "
    &cvs(xgenlines)&" + "&cvs(overest)&"/"&
    cvs(stdcharh+(millverti*vbpi+500) div 1000)&" "); ME 3/7/82;
IF GLINEM AND C NEQ FROMCOL AND MOVEGROUP(TRUE, KOLS+1-COLS,0,EXTRA) THEN
	BEGIN C←COL; L←LINE; GO FOUND END ;
IF TEXTAR(AREAIXM) THEN
	BEGIN
IF TELLXGEN THEN outstr("
"); ME 3/7/82;
	FTSTR ← SSTK[FOOTSTR(AREAIXM)] ; SSTK[FOOTSTR(AREAIXM)] ← NULL ; TES 9/12/74 ;
	NEXTPAGE ; OPENAREA(AREAIXM) ;
	SSTK[FOOTSTR(AREAIXM)] ← FTSTR & SSTK[FOOTSTR(AREAIXM)] ; TES 9/12/74 ;
	IF FROMCOL>COLS  AND COL LEQ COLS  OR FROMCOL LEQ COLS AND COL>COLS THEN
		BEGIN
		TES 12/6/73 DELETED: IF FROMCOL>COLS THEN FOOTTOP ← 1 ; COMMENT ADDED BY RKJ ;
		PAL SWAP COL ; LINE SWAP PINE ;
		END ;
	FROMCOL ← COL ; FROMLINE ← LINE; GO TO TRYHERE ;
	END
ELSE	BEGIN  TES 12/6/73 LENGTHENED MESSAGE ;
	WARN("TITLE AREA overflow","Overflowed title area " & SYM[LDB(BIXNUM(AREAIXM))]) ;
	FOR C ← 1 THRU COLS DO AA[C, 0] ← AA[COLS+C,0] ← 0 ;
	PAL ← (C ← COL ← 1) + COLS ;  L ← 0 ;
	END ;
FOUND:
IF C=COL THEN LINE←L
ELSE IF GLINEM AND MOVEGROUP(FALSE, C, L, EXTRA) THEN BEGIN L ← LINE ; C ← COL END
ELSE	BEGIN
	COL ← C ;  PAL ← (COL+COLS-1) MOD (2*COLS) + 1 ;
	LINE ← L ;  PINE ← RH(AA[PAL,0]) ;
	END ;
IF OLX+WANT+LEAD > OLXX THEN GROWOWLS(WANT+LEAD+25) ;
IF LINE+WANT+LEAD > ARRINFO(AA,4) THEN GROWAA(LINE+WANT+LEAD+10) ; TES 11/6/74;
IF LINE AND LEAD THEN
        BEGIN
	FOR I ← 1 THRU LEAD DO AA[COL, LINE+I] ← NEWBLANK(IF GROUPM OR I>1 THEN ABV!BLW ELSE BLW) ;
	LINE ← LINE + LEAD ;
	END ;
ME 2/26/82, moved from placeline, to work for SKIPLINES, TOLINES, SNEAKLINE;
XGENLINES←XGENLINES+XGENKLUDGE(IF LINE AND LEAD THEN WANT+LEAD ELSE WANT,OVEREST);
RETURN(L+1) ;
END "FIND!ROOM" ;
PUBLIC INTEGER SIMPLE PROCEDURE NEWBLANK(INTEGER MOLE) ;$"#
BEGIN MOLES[OLX←OLX+1]←MOLE ; OWLS[OLX]←0 ; RETURN(OLX); END "NEWBLANK";

PUBLIC INTEGER SIMPLE PROCEDURE NEWNEWBLANK(INTEGER NMOLE) ;$"#
BEGIN NMOLES[NOLX←NOLX+1]←NMOLE ; NOWLS[NOLX]←0 ; RETURN(NOLX); END "NEWNEWBLANK";
PRIVATE SIMPLE INTEGER PROCEDURE OWLOUT(STRING C1,C2,C3) ;$"#
	BEGIN "OWLOUT"
	TES 11/2/74 2 ARGUMENTS TO AVOID CONCATENATION ;
	IF 0=LENGTH(C1)+LENGTH(C2)+LENGTH(C3) THEN RETURN(0) ;
	OWLSEQ ← OWLSEQ + 1 ;
	IF INTER LEQ 0 THEN NOPORTION ;
	OUT(SINTER, CVS(OWLSEQ)) ; OUT(SINTER, ALTMODE) ;
	OUT(SINTER, C1) ; OUT(SINTER, C2) ; OUT(SINTER, C3) ;
	RETURN(OWLSEQ) ;
	END "OWLOUT" ;

PRIVATE SIMPLE PROCEDURE OWLPLACE(INTEGER OWLOUTVALUE, MILLLEAD) ;$"#
	BEGIN "OWLPLACE"
	TES 11/2/74 ALLOWS OWLOUT (FORMERLY OWT) TO BE CALLED WITHOUT COPYING OWL ;
	OWLS[OLX] ← OWLOUTVALUE ;
	IF MILLVERTI<0 THEN MILLVERTI←MSPREADM
	ELSE IF MILLVERTI NEQ MILLLEAD THEN
		BEGIN
		NEEDMILLVERTI ← TRUE ;
		RKJ: 6-FEB-75 make the following agree with what actually happens in pass 2 ;
		IF MILLLEAD<MILLVERTI
		    THEN OVEREST ← OVEREST + ((MILLVERTI-MILLLEAD)*VBPI+500) DIV 1000
		    ELSE OVEREST ← OVEREST - ((MILLLEAD-MILLVERTI)*VBPI+500) DIV 1000 ;
		END ;
	MLEAD[OLX] ← MILLLEAD-MILLVERTI ; TES 11/2/74 EXTRA LEADING ;
	END "OWLPLACE" ;
PUBLIC RECURSIVE PROCEDURE PLACELINE(INTEGER CHARS,POSN,XPOSN,FAKE,
	ABOVE,BELOW,LEADB,MLEADB,FIRSTLBL,
	JUSTIFY,MORECOMING) ;$"#
BEGIN "PLACELINE"
INTEGER FOOTFLAG, NEEDS, TOPLINE, GR, ATOP, I, TOLBL, LBL, FOOTNUM, WASFRAME, WASCOL, WASOLX ;
    COMMENT FOOTFLAG CHANGES  RKJ  10-10-73;
STRING XREF; 
INTEGER SOWL, MSKIP, MGSKIP, MCHARH ; TES 11/2&7/74 ;
IF  NOT DEBUG THEN XREF ← ALTMODE
ELSE	BEGIN
	XREF ← ERRLINE&"/"&SRCPAGE&"["&MACLINE&"]" ;
	FOR I ← 1 THRU MESGS DO XREF ← XREF & RUBOUT & MESGSARR[I] ;
	MESGS←0 ; XREF ← XREF & ALTMODE ;
	END ;
IFC SAILVER THENC
	COMMENT RHT 5/7/76 ;
	IF XCRIBL THEN
		BEGIN
		IF CSCRIPTM THEN
		    BEGIN
		    OVEREST←OVEREST-SCRIPTSTRENGTH*(ABOVE+BELOW);
		    IF DSCRIPTM THEN
			OVEREST←OVEREST-SCRIPTSTRENGTH*(ABOVE+BELOW);
		    END;
		ABOVE←BELOW←0;
		END;
    ENDC
IFC PARCVER OR ITSVER OR CMUVER
    THENC IF XCRIBL THEN ABOVE←BELOW←0; comment scripts; ENDC
SOWL ← OWLOUT(XREF,OWL[1 TO CHARS], CRLF) ; TES 11/2/74 AVOID CAT ;
ASSUREAREA ;
MGSKIP ← MILLGSKIP(AREAIXM) ; MILLGSKIP(AREAIXM) ← 0 ; TES 11/7/74 ;
MSKIP ← MILLSKIP(AREAIXM) ; MILLSKIP(AREAIXM) ← 0 ; TES 11/7/74 ;
IF COL > COLS THEN
	BEGIN "INFOOT" TES 12/6/73 SEPARATED CASES ;
	IF FOOTNUM ← FOOTTOP THEN
		BEGIN comment First Footnote belonging to a line ;
		GR ← GROUPM ; TES 1/15/74 ADDED 'OR GLINEM=0' BELOW: ;
		TES 8/22/74 PAL BELOW WAS COL! ;
		IF GROUPM=0 OR GLINEM=0 THEN GLINEM ← AA[PAL,PINE] ;
		GROUPM ← 1 ; FOOTTOP ← 0 ;
		END ;
	IF ATOP ← LINE=0 THEN ABOVE ← ABOVE + 1 + (FTGP+FTGP2) ; comment assure room for FOOTSEP ;
	END "INFOOT" ;
FOOTFLAG ← COL LEQ COLS AND FULSTR(SSTK[FOOTSTR(AREAIXM)]);
IF FOOTFLAG THEN
    MORECOMING←MORECOMING+2; RKJ 11/20/73 ;

TES ADDED 11/7/74 : ;
MLEADB ← MLEADB + MSKIP ;
MCHARH ← IF XCRIBL THEN ABS(MILLVERTI) + (CHARH*1000 + VBPI DIV 2) DIV VBPI ELSE 166 ;
LEADB ← LEADB + MLEADB DIV MCHARH ; MLEADB ← MLEADB MOD MCHARH ;
ABOVE ← ABOVE + MGSKIP DIV MCHARH ;
MGSKIP ← MGSKIP MOD MCHARH ;

WHILE NOT (TOPLINE ← FIND!ROOM(-LEADB,NEEDS←ABOVE+BELOW+1,COL,LINE,MORECOMING)) DO
	BEGIN ABOVE←(ABOVE-1)MAX 0; BELOW←(BELOW-1)MAX 0 END;
WASOLX ← OLX - (LINE + 1 - TOPLINE) ;
IF COL > COLS THEN
	BEGIN "BEGFOOT" TES 12/6/73 SEPARATED CASES ;
	IF FOOTNUM THEN  COMMENT FIRST FOOTNOTE BELONGING TO A LINE ;
		BEGIN "FOOT1"
		GROUPM ← GR ; IF GROUPM=0 THEN GLINEM ← 0 ;
		END "FOOT1" ;
	IF ATOP THEN BEGIN ABOVE ← ABOVE - 1 - (FTGP+FTGP2) ; TES 11/29/73 ;
			NEEDS ← NEEDS - 1 - (FTGP+FTGP2) END ;
	IF LINE = 0 THEN
		BEGIN "PUTFOOTSEPS"
		TES 11/29/73 ADDED FTGP AND ENOUGH ;
		TES 11/2&7/74 ADDED FTGP2 AND MILLVERTIDEFAULT ;
		MLEADB ← MILLVERTIDEFAULT ; TES 11/7/74 ;
		FOR I ← 1 THRU FTGP DO AA[COL,I] ←
			NEWBLANK(IF I=1 THEN ABV ELSE ABV!BLW) ;
		AA[COL, LINE←TOPLINE←1+FTGP] ← OLX ← OLX + 1 ;
		IF XCRIBL THEN
			OWLPLACE(OWLOUT(XREF,PICKFONT(FSFONT),
					ENOUGH(FOOTSEP,COLWID(AREAIXM),FSFONT)&CRLF),
				MILLVERTIDEFAULT)
		ELSE
			OWLPLACE(OWLOUT(XREF,
					FOOTSEP[1 TO COLWID(AREAIXM)],
					CRLF),
			MILLVERTIDEFAULT) ;
		MOLES[OLX] ← IF FTGP=0 THEN BLW ELSE ABV!BLW ;
		FOR I ← LINE+1 THRU LINE+FTGP2 DO AA[COL,I] ← NEWBLANK(ABV!BLW);
		LINE ← LINE + FTGP2 ; TES 11/6/74 ;
		END "PUTFOOTSEPS" ;
	END "BEGFOOT" ;
FOR I ← 1 THRU ABOVE DO AA[COL,LINE+I] ←
	NEWBLANK(IF GROUPM OR TOPLINE<LINE+I THEN ABV!BLW ELSE BLW) ;
AA[COL, LINE+ABOVE+1] ← OLX ← OLX + 1 ;
IF LINE = 0 THEN MLEADB ← MILLVERTIDEFAULT ; TES 11/7/74 ;
OWLPLACE(SOWL, MGSKIP+MLEADB) ; TES 11/2&7/74 ;
MOLES[OLX] ← (IF GROUPM OR TOPLINE<LINE+ABOVE+1 THEN ABV ELSE 0) LOR (IF GROUPM OR BELOW THEN BLW ELSE 0);
IF XCRIBL THEN I←MAXIM*CHARW + FAKE - XPOSN ELSE I←MAXIM - (POSN-FAKE);
IF JUSTIFY AND I > 0 THEN SHORT[OLX]←I ;
IF FIRSTLBL NEQ -TWO(13) THEN
	BEGIN "PAGE LABELS"
	LBL ← PLBL ; TOLBL ← 0 ;
	WHILE LBL NEQ FIRSTLBL AND LBL NEQ -TWO(13) DO
		LBL ← IF (TOLBL←LBL)>0 THEN ITBL[TOLBL] ELSE NUMBER[-TOLBL] ;
	IF LBL=-TWO(13) THEN WARN("=","Page label not in Page Label L.L.!!!")
	ELSE IF TOLBL=0 THEN PLBL ← -TWO(13)
	ELSE IF TOLBL > 0 THEN ITBL[TOLBL] ← -TWO(13)
	ELSE NUMBER[-TOLBL] ← -TWO(13) ;
	BRKPLBL ← PLBL ;
	DPB(IF FIRSTLBL<0 THEN PUTI(1,FIRSTLBL) ELSE FIRSTLBL, LABELM(OLX)) ;
	END "PAGE LABELS" ;
FOR I ← ABOVE+2 THRU NEEDS DO AA[COL,LINE+I] ← NEWBLANK(IF GROUPM OR I<NEEDS THEN ABV!BLW ELSE BLW) ;
IF GROUPM AND  NOT GLINEM THEN
	DPB(0,ABOVEM(GLINEM←IF COL>COLS THEN TOPMOST(PAL,PINE) ELSE AA[COL,TOPLINE])) ;
	TES 12/6/73 ADDED TOPMOST(PAL,PINE) ;
LINE ← LINE + NEEDS ;
IF FOOTFLAG THEN comment, Footnotes ;
BEGIN "FOOTNOTES"
WHILE (FOOTNUM←IF PINE=0 THEN 1 ELSE LDB(FOOTM(AA[PAL,PINE])) + 1) = 31 DO
	BEGIN
	WARN("=",">30 lines in col. "&COL&" want footnotes.") ;	
	FIND!ROOM(LINE, 1, COL+1, 0, 0) ;
	END ;
IF FOOTNUM=32 THEN FOOTNUM ← 1 ;  DPB(FOOTNUM, FOOTM(OLX)) ;
SEND(IXFOOT, CRLF&TB&TB& "END ""!FOOTNOTES"";;") ;
AA[COL,0] ← LHRH(COVERED, LINE) ;  PINE SWAP LINE ;  PAL SWAP COL ;
WASCOL ← COL ; WASFRAME ← FRAMEIDA ; BEGINBLOCK(TRUE, 3, "!FOOTNOTES") ; BREAKM ← 0 ;
FOOTTOP ← -1 ; WASOLX ← OLX ; RECEIVE(IXFOOT, NULL) ; PASS ; TOEND ; FOOTTOP ← 0 ;
AA[COL,0] ← LHRH(COVERED, LINE) ;
IF WASCOL NEQ COL OR WASFRAME NEQ FRAMEIDA THEN
	BEGIN FOOTNUM ← 31 ; IF WASFRAME=FRAMEIDA THEN DPB(31, FOOTM(WASOLX)) END ;
DPB(FOOTNUM, FOOTM(AA[COL,LINE])) ; PAL SWAP COL ; PINE SWAP LINE ;
END "FOOTNOTES" ;
END "PLACELINE" ;
PUBLIC SIMPLE PROCEDURE SNEAKLINE(STRING S) ;$"#
RKJ: added following procedure for change to SNEAK 6-Feb-75 ;
BEGIN "SNEAKLINE"
ASSUREAREA;
ME 2/26/82 XGENLINES now handled in FIND!ROOM: XGENLINES ← XGENLINES + 1;
FIND!ROOM(1, 0, COL, LINE, 0) ;
AA[COL,LINE+1] ← OLX ← OLX + 1 ;
OWLPLACE(OWLOUT(ALTMODE, S, CRLF), ABS(MILLVERTI)) ;
LINE ← LINE + 1 ;
END "SNEAKLINE";
PRIVATE SIMPLE INTEGER PROCEDURE TOPMOST(INTEGER COLNO, LINO) ;$"#
	BEGIN TES 12/6/73 USED BY PLACELINE FOR GLINEM IN FOOT ;
	WHILE LINO>1 AND (LDB(ABOVEM(AA[COLNO,LINO])) OR LDB(BELOWM(AA[COL,LINO-1]))) DO
		LINO ← LINO - 1 ;
	RETURN(AA[COLNO,LINO]) ;
	END "TOPMOST" ;
FINISHED

ENDOF("PASTE")